﻿using System.Configuration;
using System.Data;
using System.Windows;
using System;
using System.IO;
using System.Threading.Tasks;
using XmWpfBase.Common;

namespace XmWpfBase
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            // 设置全局异常处理
            SetupGlobalExceptionHandling();
            
            base.OnStartup(e);
        }

        private void SetupGlobalExceptionHandling()
        {
            // 处理UI线程未捕获的异常
            this.DispatcherUnhandledException += App_DispatcherUnhandledException;
            
            // 处理非UI线程未捕获的异常
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
            
            // 处理Task中未观察到的异常
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
        }

        private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
                // 记录错误日志
                ErrorLogger.LogError(e.Exception, "UI线程未处理异常");
                
                // 显示错误弹窗
                ShowErrorDialog(e.Exception, "应用程序遇到错误");
                
                // 标记异常已处理，防止应用程序崩溃
                e.Handled = true;
            }
            catch (Exception ex)
            {
                // 如果错误处理本身出错，记录到系统事件日志
                System.Diagnostics.EventLog.WriteEntry("XmWpfBase", 
                    $"错误处理失败: {ex.Message}", 
                    System.Diagnostics.EventLogEntryType.Error);
            }
        }

        private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            try
            {
                Exception exception = e.ExceptionObject as Exception;
                if (exception != null)
                {
                    // 记录错误日志
                    ErrorLogger.LogError(exception, "非UI线程未处理异常");
                    
                    // 显示错误弹窗
                    ShowErrorDialog(exception, "应用程序遇到严重错误");
                }
            }
            catch (Exception ex)
            {
                // 如果错误处理本身出错，记录到系统事件日志
                System.Diagnostics.EventLog.WriteEntry("XmWpfBase", 
                    $"严重错误处理失败: {ex.Message}", 
                    System.Diagnostics.EventLogEntryType.Error);
            }
        }

        private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
        {
            try
            {
                // 记录错误日志
                ErrorLogger.LogError(e.Exception, "Task未观察异常");
                
                // 标记异常已观察，防止应用程序终止
                e.SetObserved();
            }
            catch (Exception ex)
            {
                // 如果错误处理本身出错，记录到系统事件日志
                System.Diagnostics.EventLog.WriteEntry("XmWpfBase", 
                    $"Task异常处理失败: {ex.Message}", 
                    System.Diagnostics.EventLogEntryType.Error);
            }
        }

        private void ShowErrorDialog(Exception exception, string title)
        {
            try
            {
                string message = $"错误信息：{exception.Message}\n\n" +
                               $"错误类型：{exception.GetType().Name}\n\n" +
                               "详细错误信息已保存到日志文件中。\n\n" +
                               "是否继续运行程序？";

                MessageBoxResult result = MessageBox.Show(
                    message,
                    title,
                    MessageBoxButton.YesNo,
                    MessageBoxImage.Error);

                if (result == MessageBoxResult.No)
                {
                    // 用户选择退出程序
                    this.Shutdown();
                }
            }
            catch
            {
                // 如果弹窗显示失败，至少尝试显示简单消息
                MessageBox.Show("应用程序遇到错误，请查看日志文件。", "错误", 
                    MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
}
